package com.yougou.utils;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.yougou.data.model.CartItem;
import com.yougou.data.model.Goods;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class CartManager {
    
    private static final String KEY_CART_PREFIX = "key_cart_";
    private static List<CartItem> cartItems;
    private static Gson gson = new Gson();
    
    
    private static String getCartKey() {
        String uid = UserManager.isLogin() ? UserManager.getCurrentUser().getUid() : "guest";
        return KEY_CART_PREFIX + uid;
    }
    
    
    public static void addToCart(Goods goods) {
        addToCart(goods, 1);
    }
    
    
    public static void addToCart(Goods goods, int quantity) {
        List<CartItem> items = getCartItems();
        
        // 检查是否已存在
        boolean exists = false;
        for (CartItem item : items) {
            if (item.getGoods().getGoodsId() == goods.getGoodsId()) {
                item.setQuantity(item.getQuantity() + quantity);
                exists = true;
                break;
            }
        }
        
        // 不存在则新增
        if (!exists) {
            CartItem newItem = new CartItem(goods, quantity);
            newItem.setId(items.size() + 1);
            items.add(newItem);
        }
        
        saveCartItems(items);
    }
    
    
    public static void removeFromCart(int goodsId) {
        List<CartItem> items = getCartItems();
        items.removeIf(item -> item.getGoods().getGoodsId() == goodsId);
        saveCartItems(items);
    }
    
    
    public static void updateQuantity(int goodsId, int quantity) {
        List<CartItem> items = getCartItems();
        for (CartItem item : items) {
            if (item.getGoods().getGoodsId() == goodsId) {
                if (quantity <= 0) {
                    removeFromCart(goodsId);
                } else {
                    item.setQuantity(quantity);
                }
                break;
            }
        }
        saveCartItems(items);
    }
    
    
    public static void updateChecked(int goodsId, boolean checked) {
        List<CartItem> items = getCartItems();
        for (CartItem item : items) {
            if (item.getGoods().getGoodsId() == goodsId) {
                item.setChecked(checked);
                break;
            }
        }
        saveCartItems(items);
    }
    
    
    public static void updateAllChecked(boolean checked) {
        List<CartItem> items = getCartItems();
        for (CartItem item : items) {
            item.setChecked(checked);
        }
        saveCartItems(items);
    }
    
    
    public static void clearCart() {
        cartItems = new ArrayList<>();
        saveCartItems(cartItems);
    }
    
    
    public static void removeCheckedItems() {
        List<CartItem> items = getCartItems();
        items.removeIf(CartItem::isChecked);
        saveCartItems(items);
    }
    
    
    public static List<CartItem> getCartItems() {
        // 每次都重新加载，确保数据是当前用户的
        String json = SPUtils.getString(getCartKey());
        if (json.isEmpty()) {
            cartItems = new ArrayList<>();
        } else {
            Type type = new TypeToken<List<CartItem>>() {}.getType();
            cartItems = gson.fromJson(json, type);
            if (cartItems == null) {
                cartItems = new ArrayList<>();
            }
        }
        return cartItems;
    }
    
    
    public static int getCartCount() {
        return getCartItems().size();
    }
    
    
    public static double getCheckedTotal() {
        double total = 0;
        for (CartItem item : getCartItems()) {
            if (item.isChecked()) {
                total += item.getSubtotal();
            }
        }
        return total;
    }
    
    
    public static int getCheckedCount() {
        int count = 0;
        for (CartItem item : getCartItems()) {
            if (item.isChecked()) {
                count++;
            }
        }
        return count;
    }
    
    
    public static boolean isAllChecked() {
        List<CartItem> items = getCartItems();
        if (items.isEmpty()) {
            return false;
        }
        for (CartItem item : items) {
            if (!item.isChecked()) {
                return false;
            }
        }
        return true;
    }
    
    
    private static void saveCartItems(List<CartItem> items) {
        cartItems = items;
        String json = gson.toJson(items);
        SPUtils.putString(getCartKey(), json);
    }
}

